<?php

namespace common\helps;
use app\models\CtiConfig;
use yii\helpers\ArrayHelper;

/**
 * 自定义的全局的公共的方法
 * @author Administrator
 *
 */
class XmlTool
{
    /**
     * @param $file 需要替换的文件
     * @param $searchNode 搜索的标签 以及该标签的属性 ，最后一个是二维数组
     * $searchNode 最后一个数组有特殊含义
     * 如果最后一个数组是二维数组如：
     * ['action'=>['id'=>'IMSOutbound_record_session','application'=>'test']]，那么就会寻找application属性的test变量进行修改
     * 如果最后一个数组是二维数组，但是没有键值，如：
     * ['action'=>['id'=>'IMSOutbound_record_session','application']]，那么就会寻找application属性里面的内容进行修改，而不会寻找test属性
     * @param $replace 替换的值
     * @return int
     */
    public static function replaceXml($file,$searchNode,$replace) {
        $CtiConfig = CtiConfig::find()->where(['type'=>'rdhpz_freeswitchDirectory'])->one();
        $remark = json_decode($CtiConfig->remark,true);
        $dom=new \DOMDocument('1.0');
        $dom->load($remark['root'].'/'.$remark['path'].$file);
        $node = $dom;
        foreach ($searchNode as $k=>$v){
            if (!is_array($v)){
                //查找 节点
                $node = $node->getElementsByTagName($v);
                //第一个 节点
                $node = $node->item(0);
            }else{
                //查找 节点
                $node = $node->getElementsByTagName(array_keys($v)[0]);
                if(count(array_values($v)[0])>1){//表示最后一个数组的值是要替换的条件
                    $search = array_values($v)[0];
                    foreach($node as $k=>$a) {
                        $temp = 0;
                        $countP = 0;
                        $item = array_values($v)[0];
                        if (!empty($item[0])){//表示最后一个数组是字符串，需要修改的
                            foreach (array_values($v)[0] as $p_=>$p){
                                if ($a->getAttribute($p_)==$p){
                                    $temp ++;
                                }
                            }
                            $node = $a;
                            if ($temp>0){
                                $node->setAttribute($item[0],$replace);
                            }
                        }else{
                            foreach (array_values($v)[0] as $p_=>$p){
                                $pp = explode('=',$a->getAttribute($p_));
                                $countP = count($pp);
                                if ($countP>1){
                                    if ($pp[0]==$p){
                                        $temp ++;
                                    }
                                }else{
                                    if ($a->getAttribute($p_)==$p){
                                        $temp ++;
                                    }
                                }
                            }
                            $node = $a;
                            $key = array_keys($search)[count($search)-1];
                            $val = $search[$key];
                            if ($temp == count($search) && $countP==2){
                                $node->setAttribute($key,$val.'='.$replace);
                            }
                            if ($temp == count($search) && $countP==1){
                                $node->setAttribute($key,$replace);
                            }
                        }

                    }
                }else{
                    $search = array_values($v)[0];
                    foreach($node as $k=>$a) {
                        foreach ($a->attributes as $kk=>$b) {
                            if ($b->nodeName == array_keys($search)[0] && $b->nodeValue == array_values($search)[0]) {
                                $node=$a;
                            }
                        }
                    }
                }
            }
        }
        //保存到ftp
        $fromFile = XmlTool::genRandomFile();
        $dom->save($fromFile);
        return XmlTool::ftpSaveFile($remark,$fromFile,$file);
    }

    /**
     * 保存到ftp ($remark,'/conf/vars.xml',$res3)
     * @param $remark 配置文件内容 通过如下方式获得
     *  $CtiConfig = CtiConfig::find()->where(['type'=>'rdhpz_freeswitchDirectory'])->one();
        $remark = json_decode($CtiConfig->remark);
     * @param $fromFile 'FreesWitch/conf/vars.xml'
     * @param $toFile '/conf/vars.xml'
     */
    public static function ftpSaveFile($remark,$fromFile,$toFile){
        $conn_id = ftp_connect($remark['domain'],$remark['port']) or die("Could not connect");
        ftp_login($conn_id,$remark['account'],$remark['password']);
        $fp = fopen($fromFile, "r");
        ftp_fput($conn_id,$remark['path'].$toFile,$fp,2);
        ftp_close($conn_id);
        fclose($fp);
        unlink($fromFile);
        return 1;
    }

    /**
     * 产生随机的文件不唯一 生成到./temp目录下
     * @return string
     */
    public static function genRandomFile(){
        $tempfile = "./temp/tempXml".Tools::randName().'.xml';
        if (file_exists($tempfile)){
            Tools::genRandomFile();
        }else{
            return $tempfile;
        }
    }

}